const GROUP_NAME = 'classes';
const {
  getClasses,
  addClass,
  getClassById,
  deleteClassById,
  deleteClassesByIds,
  updateClassById,
  isExist,
} = require('../handler/classesHandler');

exports.plugin = {
  name: 'routerClasses',
  async register(server) {
    const { Joi, headers } = server;
    await server.route([
      { // 获取班级
        method: 'get',
        path: `/${GROUP_NAME}`,
        handler: getClasses,
        config: {
          notes: '获取班级',
          description: '获取班级',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            query: Joi.object({
              page: Joi.number().integer().min(1).default(1)
                .description('页码：默认第1页，最小值为1')
                .error(() => new Error('页码：默认第1页，最小值为1')),
              perPage: Joi.number().integer().min(1).default(10)
                .description('每页的记录数：默认10条，最小值为1')
                .error(() => new Error('每页的记录数：默认10条，最小值为1')),
              searchField: Joi.string().allow('classname')
                .default('')
                .description('要搜索的字段')
                .error(() => new Error('字段非法')),
              searchValue: Joi.string().default('')
                .description('要搜索的内容')
                .error(() => new Error('要搜索的内容')),
            }),
          },
        },
      },
      { // 添加班级
        method: 'post',
        path: `/${GROUP_NAME}`,
        handler: addClass,
        config: {
          notes: '添加班级',
          description: '添加班级',
          tags: ['api', GROUP_NAME],
          plugins: {
            'hapi-swagger': {
              payloadType: 'form',
            },
          },
          validate: {
            headers,
            payload: Joi.object({
              classname: Joi.string().required().trim()
                .description('班级:2-18个字符组合')
                .error(() => new Error('班级:2-18个字符组合')),
            }),
          },
        },
      },

      { // 根据id获取单个班级信息
        method: 'GET',
        path: `/${GROUP_NAME}/{id}`,
        handler: getClassById,
        config: {
          notes: '根据ID获取单个班级信息',
          description: '根据ID获取单个班级信息',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('班级id')
                .error(() => new Error('班级id非法')),
            }),
          },
        },
      },


      { // 根据ID删除班级
        method: 'delete',
        path: `/${GROUP_NAME}/{id}`,
        handler: deleteClassById,
        config: {
          notes: '根据ID删除班级',
          description: '根据ID删除班级',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('班级id')
                .error(() => new Error('班级id非法')),
            }),
          },
        },
      },

      { // 根据多个ID批量删除班级
        method: 'delete',
        path: `/${GROUP_NAME}`,
        handler: deleteClassesByIds,
        config: {
          notes: '根据多个ID批量删除班级',
          description: '根据多个ID批量删除班级',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            payload: Joi.object({
              ids: Joi.array().required().items(
                Joi.string().hex().length(24).required()
                  .description('班级id')
                  .error(() => new Error('班级id非法')),
              ),
            }),
          },
        },
      },

      { // 根据ID编辑班级信息
        method: 'put',
        path: `/${GROUP_NAME}/{id}`,
        handler: updateClassById,
        config: {
          notes: '根据ID更新班级信息',
          description: '根据ID更新班级信息',
          tags: ['api', GROUP_NAME],
          plugins: {
            'hapi-swagger': {
              payloadType: 'form',
            },
          },
          validate: {
            headers,
            params: Joi.object({
              id: Joi.string().required().hex().length(24)
                .description('班级id')
                .error(() => new Error('班级id非法')),
            }),
            payload: Joi.object({
              classname: Joi.string().trim()
                .description('班级:2-18个字符组合')
                .error(() => new Error('班级:2-18个字符组合')),
            }),
          },
        },
      },

      { // 判断字段值是否存在
        method: 'get',
        path: `/${GROUP_NAME}/exist`,
        handler: isExist,
        config: {
          notes: '判断字段值是否存在',
          description: '判断字段值是否存在',
          tags: ['api', GROUP_NAME],
          validate: {
            headers,
            query: Joi.object({
              field: Joi.string().required().allow('classname')
                .description('字段名')
                .error(() => new Error('字段名非法')),
              value: Joi.string().required()
                .description('值')
                .error(() => new Error('值必须填写')),
            }),
          },
        },
      },
      //
    ]);
  },
};
